package org.dromara.netbar.service;

import org.dromara.netbar.domain.vo.NetbarCouponMemberVo;
import org.dromara.netbar.domain.bo.NetbarCouponMemberBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.netbar.domain.vo.NetbarCouponVo;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 会员-卡券关联Service接口
 *
 * @author Lion Li
 * @date 2025-07-15
 */
public interface INetbarCouponMemberService {

    /**
     * 查询会员-卡券关联
     *
     * @param couponMemberId 主键
     * @return 会员-卡券关联
     */
    NetbarCouponMemberVo queryById(Long couponMemberId);

    /**
     * 分页查询会员-卡券关联列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 会员-卡券关联分页列表
     */
    TableDataInfo<NetbarCouponMemberVo> queryPageList(NetbarCouponMemberBo bo, PageQuery pageQuery);

    /**
     * 查询符合条件的会员-卡券关联列表
     *
     * @param bo 查询条件
     * @return 会员-卡券关联列表
     */
    List<NetbarCouponMemberVo> queryList(NetbarCouponMemberBo bo);

    /**
     * 新增会员-卡券关联
     *
     * @param bo 会员-卡券关联
     * @return 是否新增成功
     */
    Boolean insertByBo(NetbarCouponMemberBo bo);

    /**
     * 修改会员-卡券关联
     *
     * @param bo 会员-卡券关联
     * @return 是否修改成功
     */
    Boolean updateByBo(NetbarCouponMemberBo bo);

    /**
     * 校验并批量删除会员-卡券关联信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    List<NetbarCouponMemberVo> listCouponMemberByMemberIds(List<Long> memberIds);

    Map<String, NetbarCouponVo> listCouponMemberUsed(String tenantId, List<Long> memberIds);

    List<NetbarCouponMemberVo> listCouponMemberGroupByMemberIds(List<Long> memberIds,String nowDateStr);

    List<NetbarCouponMemberVo> listCouponMemberGroupByMemberIds(List<Long> memberIds);

    /**
     * 批量获取会员使用的卡券缓存信息
     * @param tenantId 租户ID
     * @return Map<会员ID_卡券类型, 卡券缓存数据>
     */
    Map<String, Map<String, Object>> getBatchMemberUseCouponMapByTenantId(String tenantId);

    /**
     * 获取会员使用的卡券缓存信息
     * @param tenantId 租户ID
     * @param memberId 会员ID
     * @return Map<卡券类型, 卡券缓存数据>
     */
    Map<String, Map<String, Object>> getMemberUserCouponMapByTenantIdAndMemberId(String tenantId, Long memberId);

    /**
     * 获取会员使用的卡券缓存信息
     * @param tenantId 租户ID
     * @param memberId 会员ID
     * @param couponType 卡券类型
     * @return 卡券缓存数据
     */
    Map<String, Object> getMemberUserCouponMapByTenantIdAndMemberIdAndCouponType(String tenantId, Long memberId, String couponType);

    /**
     * 保存会员使用的卡券缓存信息
     * @param couponNumberMap 卡券编号Map
     * @param memberIdList 会员ID List
     */
    void saveCouponMemberByMap(Map<Long, Long> couponNumberMap, List<Long> memberIdList);

    /**
     * 获取会员可以自动使用的卡券
     * @param memberIds 会员ID List
     */
    List<NetbarCouponMemberVo> listCouponMemberAuto(List<Long> memberIds, String couponType);

    Map<Long, Integer> countMapByCouponIds(Long[] couponIds);

    void changeStatusByMemberIdListByCouponIdList(List<Long> memberIdList, List<Long> couponIdList, String status);

    /**
     * 删除会员的卡券
     * @param bo
     */
    void deleteCouponMember(NetbarCouponMemberBo bo);

    List<NetbarCouponMemberVo> queryDjqListByBalance(Long memberId, Long balance);

    List<NetbarCouponMemberVo> listCouponMemberByCouponMemberIds(List<Long> useCouponMemberIds, String couponType);
}
